package message.controller;

import message.model.Friendmap;
import message.model.User;
import message.service.FriendService;
import message.service.UserService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping("user")
public class FriendController {
	@Resource
	private FriendService friendService;
	private UserService userService;
	private final Log logger = LogFactory.getLog(getClass());

	/**
	 * 
	 * @author: �����
	 * @date: 2016��6��21��
	 * @param session
	 * @describe��
	 * @return ���ظ���״̬�ĺ��ѷ���
	 * ��ʾ�ҵĺ����б��е�ȫ������
	 * ��Ϊ���ݿ���Ʒ�ʽԭ�򣬰������˵�id��Ϊuserid,�������˵�id��Ϊfriendid�����ԣ����Լ�������ʱ����Ὣ�Լ���id��Ϊfriendidλ��
	 * �����ݿ�friendmap ���У�״̬Ϊ1������£���һ������ӳ����У�userid,friendidֻҪ�����Լ���id���룬
	 * ����Ϊ�������ӳ��� �е���һ��idΪ�Լ�����id��
	 * �磺useridΪ�Լ���id���룬��friendid�����Լ��ĺ��ѵ�id���롣�������˵���Լ�Ϊ��������Ӻ���
	 * ���磺friendidΪ�Լ���id���룬��userid Ϊ���ѵ�id���롣�������˵���Լ�Ϊ����������Ӻ���
	 * -1:������  0���ȴ� 1���������� 
	 */

	@RequestMapping("/showFriends")
	public ModelAndView showFriends(HttpSession session){
		ModelAndView mav=new ModelAndView();
		User host=(User)session.getAttribute("host");  //��session�л�ȡ���˵��û���Ϣ
		int hostid=host.getUserid();                   //��ȡ����userid
		List sendfriends= friendService.findFriendMapSend(hostid,1);      //��ѯ������Ϊ���������ߵ�state Ϊ1���������Ѷ�
		List receivefriends=friendService.findFriendMapReceive(hostid,1); //��ѯ������Ϊ���ѱ������ߵ�state Ϊ1���������Ѷ�

		List sendblackfriends= friendService.findFriendMapSend(hostid,-1);     //��ѯ������Ϊ����������state Ϊ-1�����������Ѷ�
		List receiveblackfriends=friendService.findFriendMapReceive(hostid,-1);//��ѯ������Ϊ���ѱ������ߵ�state Ϊ-1�����������Ѷ�

		List receivewaitfriends=friendService.findFriendMapReceive(hostid,0);//��ѯ��state Ϊ0���Լ�Ϊ�����󷽵ĵȴ�ȷ�Ͻ��յ��û��ĺ��Ѷ�
		List allfriendlist=new ArrayList();   
		List blackList=new ArrayList();
		List waitList=new ArrayList();
		allfriendlist=this.collectFriend(sendfriends, receivefriends);//���ڲ�ѯ�������ֹ��ɣ��ʺϲ���
		blackList=this.collectFriend(sendblackfriends, receiveblackfriends);  //�������ֺϲ�
		waitList=this.collectFriend(null, receivewaitfriends); //�ȴ�״̬
		mav.addObject("blackList", blackList);   //�������������model��
		mav.addObject("allfriendlist", allfriendlist);
		mav.addObject("waitList", waitList);
		mav.setViewName("showfriends");
		logger.info(host.getQq()+"�鿴���к���");
		return mav;
	}


	/**
	 * @author: �����
	 * @date: 2016��6��22��
	 * @param sendfriends
	 * @param receivefriends
	 * @return ������״̬�ĺ��Ѻϲ�
	 * @describe�� ����hostΪ������ʱ�ĺ��ѶԺͱ�������ʱ�ĺ��Ѷԣ���ȡ���к��ѵ�id��ͨ��id��ȡ������Ϣ
	 * �����еĺ�����Ϣ����Ҫ���ص�List�б���
	 */
	public List collectFriend(List sendfriends,List receivefriends){
		List allfriendlist=new ArrayList();
		//�������б��е���Ϣ��ȡ��һ����������
		if(sendfriends!=null){
			for(int i=0;i<sendfriends.size();i++){
				Friendmap friendmap=(Friendmap)sendfriends.get(i);//��ȡһ������ӳ���
				User user1= userService.findUserById(friendmap.getFriendid());//��ȡ��������ӳ��Ե�friendid�����������ߵ��û�id
				allfriendlist.add(user1); //������������ߵ���Ϣ
			}
		}
		if(receivefriends!=null){
			for(int i=0;i<receivefriends.size();i++){
				Friendmap friendmap=(Friendmap)receivefriends.get(i);//��ȡһ������ӳ���
				User user2= userService.findUserById(friendmap.getUserid());//��ȡ��������ӳ��Ե�userid�����������ߵ��û�id
				allfriendlist.add(user2); //��������������ߵ���Ϣ
			}
		}
		return allfriendlist;
	}

	/**
	 * @author: �����
	 * @date: 2016��6��24��
	 * @param friendid  ����
	 * @param session
	 * @describe�� ������ѣ����ǲ��ǳɹ���Ϊ�������ѣ���Ҫ�ȴ��Է�ͬ�⣬��state��0��Ϊ1��
	 */
	@RequestMapping("/askforFriend")
	public ModelAndView askforFriend(Integer friendid,HttpSession session){
		ModelAndView mav=new ModelAndView();
		mav.setViewName("operainforback");
		String friendUsername=userService.findUserById(friendid).getUsername();//��ȡ�����ǳƣ�������ת�����Ҫ��Ϣ
		User host=(User) session.getAttribute("host");
		Friendmap friendmapexist1=friendService.findFriendmap(friendid,host.getUserid(), 1); //��ȡ���ݿ����Ƿ���ں���ӳ��ֵ��
		Friendmap friendmapexist2=friendService.findFriendmap(host.getUserid(),friendid, 1);  //��ȡ���ݿ����Ƿ���ں���ӳ��ֵ��
		Friendmap friendmapreceiveconfirm=friendService.findFriendmap(friendid,host.getUserid(), 0);//��ȡ�Լ�Ϊ��������״̬Ϊ0�ȴ�״̬�ĺ��Ѷԣ������ж��Ƿ��Լ�����"�Լ���Ҫ������û�"�����
		Friendmap friendmapsendconfirm=friendService.findFriendmap(host.getUserid(),friendid, 0);
		Friendmap friendmapblackreceiveconfirm=friendService.findFriendmap(friendid,host.getUserid(), -1);//��ȡ�Լ�Ϊ��������״̬Ϊ������״̬�ĺ��Ѷ�
		Friendmap friendmapblacksendconfirm=friendService.findFriendmap(host.getUserid(),friendid, -1);//��ȡ�Լ�Ϊ������״̬Ϊ������״̬�ĺ��Ѷ�
		/*�ж���ӵĺ����Ƿ����Լ�
		 *�����ڣ��򷵻���ʾ  ����������Լ�Ϊ���ѣ���
		 **/
		if(friendid.equals(host.getUserid())){
			mav.addObject("askfor_fail", "��������Լ�Ϊ���ѣ�");
		}
		/*��ȡ���ݿ����Ƿ���ں���ӳ��ֵ��
		 *�����ڣ��򷵻���ʾ  ���Է��������ĺ����б��У�������ӣ���
		 **/
		else if(friendmapexist1!=null||friendmapexist2!=null){
			mav.addObject("askfor_fail", friendUsername+" �������ĺ����б��У�������ӣ�");
		}

		/*��ȡ���ݿ����Ƿ����δȷ�ϵĺ������󣬱�����δȷ��״̬��˫������������������ݿ���ֲ���Ҫ������ӳ��ԣ�
		 * �����ڣ��򷵻���ʾ  ���Է��Ѿ������������������ȴ�����
		 * */

		else if(friendmapreceiveconfirm!=null){
			mav.addObject("askfor_fail", friendUsername+"  �Ѿ������������������ȴ���");
		}
		/*
		 * ��ȡ���ݿ����Ƿ�����Լ�������ļ�¼��
		 * �����ڣ��򷵻���ʾ�����������������ȴ��Է�ȷ�ϣ���
		 */

		else if(friendmapsendconfirm!=null){
			mav.addObject("askfor_fail","���������������ȴ��Է�ȷ�ϣ�");
		}

		else if(friendmapblackreceiveconfirm!=null||friendmapblacksendconfirm!=null){
			mav.addObject("askfor_fail","�������������еĳ�Ա���������������лָ�Ϊ�������ѣ�");
		}
		/*
		 * ��ӵ����ݿ��������,������״̬��Ϊ0,���ȴ�ȷ��״̬
		 * ���ɹ����򷵻���ʾ������ɹ�����ȴ��Է����ܡ���
		 */
		else{
			Friendmap friendmap=new Friendmap();
			friendmap.setFriendid(friendid);
			friendmap.setUserid(host.getUserid());
			friendmap.setState(0);  //��״̬��Ϊ0,��ʾ����ȴ�
			java.util.Date  date=new java.util.Date();
			java.sql.Timestamp time=new java.sql.Timestamp(date.getTime()); //���뵱ǰʱ��
			friendmap.setAddtime(time);  //��������ʱ�䡣���ﲻΪ��ӳɹ�ʱ�䡣����Է�ȷ�ϣ������ʱ���Ϊ���ʱ��
			boolean askfor_suc=friendService.askforFriend(friendmap);
			if(askfor_suc){
				logger.info(host.getQq()+"��"+userService.findUserById(friendid).getQq()+"���ѵĺ�������");
				mav.addObject("askfor_suc", "����ɹ�����ȴ�  "+ friendUsername+" ����");
			}else{
				mav.addObject("askfor_fail", "����ʧ�ܣ�����������ά�ޣ�");
			}
		}
		return mav;
	}
	/**
	 * @author: �����
	 * @date: 2016��6��24��
	 * @param friendid  ����
	 * @param session
	 * @describe�� �ָ����������ѣ�ԭ��ɾ��ԭ�еĺ��Ѷԣ����� ���󷽷�
	 */
	@RequestMapping("/regainFriend")
	public ModelAndView regainFriend(Integer friendid,HttpSession session){
		ModelAndView mav=new ModelAndView();      //����һ��ModelAndView ʵ������
		User host=(User) session.getAttribute("host");
		Friendmap friendmapblackreceiveconfirm=friendService.findFriendmap(friendid,host.getUserid(), -1);//��ȡ�Լ�Ϊ��������״̬Ϊ������״̬�ĺ��Ѷ�
		Friendmap friendmapblacksendconfirm=friendService.findFriendmap(host.getUserid(),friendid, -1);//��ȡ�Լ�Ϊ������״̬Ϊ������״̬�ĺ��Ѷ�

			if(friendmapblackreceiveconfirm!=null){
				boolean delete_suc= friendService.deleteFriendmap(friendmapblackreceiveconfirm.getFriendmapid());
				if(delete_suc){
					logger.info(host.getQq()+"��"+userService.findUserById(friendid).getQq()+"���ѵĺ�������");
					mav.setViewName("redirect:/user/askforFriend?friendid="+friendid); //�ض������� ������
					} 
				else{
					mav.addObject("delete_fail", "����������ά�������Ժ�");
					mav.setViewName("operainforback");
				}
			}
			else if(friendmapblacksendconfirm!=null){
				boolean delete_suc=friendService.deleteFriendmap(friendmapblacksendconfirm.getFriendmapid());
				if(delete_suc){
					 mav.setViewName("redirect:/user/askforFriend?friendid="+friendid);  //�ض������� ������
				} 
				else{
					mav.addObject("delete_fail", "����������ά�������Ժ�");
					mav.setViewName("operainforback");
				}
			}
			else{
				logger.info(host.getQq()+"��"+userService.findUserById(friendid).getQq()+"���ѵĺ�������,����ʧ�ܣ�ԭ��sql����");
				mav.addObject("delete_fail", "����������ά�������Ժ�");
				mav.setViewName("operainforback");
			}
		return mav;

	}

	/**
	 * @author: �����
	 * @date: 2016��6��24��
	 * @param session
	 * @describe�� ���ܺ������󣬼���state��0��Ϊ1
	 */
	@RequestMapping("/agreeFriend")
	public ModelAndView agreeFriend(@RequestParam(value="userid")Integer friendid,HttpSession session){
		ModelAndView mav=new ModelAndView();      //����һ��ModelAndView ʵ������
		User host=(User) session.getAttribute("host");   //��ȡ����userid����������friendid��ѯ���Ѷ�
		String friendUsername=userService.findUserById(friendid).getUsername();//��ȡ�����ǳƣ�������ת�����Ҫ��Ϣ
		Friendmap friendmap=friendService.findFriendmap( friendid, host.getUserid(),0);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		if(friendmap!=null){   
			friendmap.setState(1);          //���ȴ�״̬����Ϊ��������״̬
			 java.util.Date  date=new java.util.Date();
			 java.sql.Timestamp time=new java.sql.Timestamp(date.getTime()); //���뵱ǰʱ��
			friendmap.setAddtime(time);
			boolean agree_suc=friendService.updateFriendmap(friendmap);
			if(agree_suc){
				logger.info(host.getQq()+"��"+userService.findUserById(friendid).getQq()+"���ѵĺ�������");
				mav.addObject("agree_suc","�ѳɹ�����"+friendUsername+"������");
			}
			else{
				mav.addObject("agree_fail","����������ά�������Ժ�");
			}
		}
		else{
			mav.addObject("agree_fail","����������ά�������Ժ�");
		}
		mav.setViewName("operainforback");
		return mav;

	}

	/**
	 * @author: �����
	 * @date: 2016��6��24��
	 * @param userid
	 * @param session
	 * @describe�� �ܾ��������󣬼�ɾ��һ�����Ѷԡ� //��ȡ����userid����������friendid��ѯ���Ѷԣ�Ȼ��ɾ�����Ѷ�
	 */
	@RequestMapping("/refuseFriend")
	public ModelAndView refuseFriend(@RequestParam(value="userid")Integer friendid,HttpSession session){
		ModelAndView mav=new ModelAndView();  //����һ��ModelAndView ʵ������
		User host=(User) session.getAttribute("host");    //��ȡ����userid����������friendid��ѯ���Ѷԣ�Ȼ��ɾ�����Ѷ�
		String friendUsername=userService.findUserById(friendid).getUsername();//��ȡ�����ǳƣ�������ת�����Ҫ��Ϣ
		Friendmap friendmap=friendService.findFriendmap(friendid, host.getUserid(),0);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		if(friendmap!=null){   //Ϊ���������£���ѯ����״̬Ϊ0�ĺ��� ��
			boolean agree_suc=friendService.deleteFriendmap(friendmap.getFriendmapid());//ɾ������
			if(agree_suc){
				logger.info(host.getQq()+"�ܾ���"+userService.findUserById(friendid).getQq()+"���ѵĺ�������");
				mav.addObject("refuse_suc","���ܾ��� "+friendUsername+" ������");
			}
			else{
				mav.addObject("refuse_fail","����������ά�������Ժ�");  //���ɾ��ʧ�ܣ������Ѻ���ʾ��Ϣ
			}
		}
		else{
			mav.addObject("refuse_fail","����������ά�������Ժ�");
		}
		mav.setViewName("operainforback");
		return mav;
	}

	/**
	 * @author: �����
	 * @date: 2016��6��24��
	 * @param userid
	 * @param session
	 * @describe�� ���ڣ�������һ�����Ѷԣ�ʹ����״̬��1���-1
	 */
	@RequestMapping("/blackFriend")
	public ModelAndView blackFriend(@RequestParam(value="userid")Integer friendid,HttpSession session){
		ModelAndView mav=new ModelAndView();
		User host=(User) session.getAttribute("host");   //��ȡ����userid����������friendid��ѯ���Ѷԣ�Ȼ����º��Ѷ�
		String friendUsername=userService.findUserById(friendid).getUsername();//��ȡ�����ǳƣ�������ת�����Ҫ��Ϣ
		Friendmap friendmap=friendService.findFriendmap(friendid, host.getUserid(),1);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		Friendmap friendmap1=friendService.findFriendmap(host.getUserid(),friendid, 1);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		if(friendmap1!=null){
			friendmap1.setState(-1);    //������״̬״̬����Ϊ���ں���״̬
			boolean black_suc=friendService.updateFriendmap(friendmap1);  //���²���
			if(black_suc){
				logger.info(host.getQq()+"������"+userService.findUserById(friendid).getQq()+"��");
				mav.addObject("black_suc","��������"+friendUsername+"��");
			}
			else{
				mav.addObject("black_fail","����������ά�������Ժ�");
			}
		}
		if(friendmap!=null){
			friendmap.setState(-1);    //������״̬״̬����Ϊ���ں���״̬
			boolean black_suc=friendService.updateFriendmap(friendmap);   //���²���
			if(black_suc){
				logger.info(host.getQq()+"������"+userService.findUserById(friendid).getQq()+"��");
				mav.addObject("black_suc","��������"+friendUsername+"��");
			}
			else{
				mav.addObject("black_fail","����������ά�������Ժ�");
			}
		}
		mav.setViewName("operainforback");
		return mav;
	}

	/**
	 * @author: �����
	 * @date: 2016��6��24��
	 * @param userid
	 * @param session
	 * @describe�� ɾ�����ѣ���ɾ��stateΪ1��һ�����Ѷ�
	 */
	@RequestMapping("/deleteFriend")
	public ModelAndView deleteFriend(@RequestParam(value="userid")Integer friendid,HttpSession session){
		ModelAndView mav=new ModelAndView();
		User host=(User) session.getAttribute("host");
		String friendUsername=userService.findUserById(friendid).getUsername();//��ȡ�����ǳƣ�������ת�����Ҫ��Ϣ
		Friendmap friendmap=friendService.findFriendmap(friendid, host.getUserid(),1);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		Friendmap friendmap1=friendService.findFriendmap(host.getUserid(),friendid, 1);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		if(friendmap1!=null){
			boolean delete_suc=friendService.deleteFriendmap(friendmap1.getFriendmapid());
			if(delete_suc){
				logger.info(host.getQq()+"ɾ����"+userService.findUserById(friendid).getQq()+"��");
				mav.addObject("delete_suc","��ɾ����"+friendUsername+"��");
			}
			else{
				mav.addObject("delete_fail","����������ά�������Ժ�");
			}
		}
		if(friendmap!=null){
			boolean delete_suc=friendService.deleteFriendmap(friendmap.getFriendmapid());
			if(delete_suc){
				mav.addObject("delete_suc","��ɾ����"+friendUsername+"��");
			}
			else{
				mav.addObject("delete_fail","����������ά�������Ժ�");
			}
		}
		mav.setViewName("operainforback");
		return mav;
	}

	/**
	 * @author: �����
	 * @date: 2016��6��24��
	 * @param session
	 * @describe�� ɾ�����������ѣ���ɾ��һ��stateΪ-1�ĺ��Ѷ�
	 */
	@RequestMapping("/deleteblackFriend")
	public ModelAndView deleteblackFriend(@RequestParam(value="userid")Integer friendid,HttpSession session){
		ModelAndView mav=new ModelAndView();
		User host=(User) session.getAttribute("host");
		String friendUsername=userService.findUserById(friendid).getUsername();//��ȡ�����ǳƣ�������ת�����Ҫ��Ϣ
		Friendmap friendmap=friendService.findFriendmap(friendid, host.getUserid(),-1);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		Friendmap friendmap1=friendService.findFriendmap(host.getUserid(),friendid, -1);	//��ȡ����ӳ������Լ�Ϊ����������ݵĺ���ӳ���
		if(friendmap1!=null){
			boolean delete_suc=friendService.deleteFriendmap(friendmap1.getFriendmapid());
			if(delete_suc){
				logger.info(host.getQq()+"ɾ���˺���������"+userService.findUserById(friendid).getQq()+"��");
				mav.addObject("delete_suc","��ɾ����"+friendUsername+"��");
			}
			else{
				mav.addObject("delete_fail","����������ά�������Ժ�");
			}
		}
		if(friendmap!=null){
			boolean delete_suc=friendService.deleteFriendmap(friendmap.getFriendmapid());
			if(delete_suc){
				logger.info(host.getQq()+"ɾ���˺���������"+userService.findUserById(friendid).getQq()+"��");
				mav.addObject("delete_suc","��ɾ����"+friendUsername+"��");
			}
			else{
				mav.addObject("delete_fail","����������ά�������Ժ�");
			}
		}
		mav.setViewName("operainforback");
		return mav;
	}


}


